package MyArrayList;
import java.util.Arrays;
//
//public class MyArrayList {
//    private int[] elem;
//    private int usedSize; // 记录有效元素的个数
//    private static final int DEFAULT_SIZE = 10;
//
//    public MyArrayList() {
//        this.elem = new int[DEFAULT_SIZE];
//        this.usedSize = 0;
//    }
//
//    // 带初始容量的构造函数
//    public MyArrayList(int initCapacity) {
//        if (initCapacity > 0) {
//            this.elem = new int[initCapacity]; // 使用 Object[] 创建数组
//        } else if (initCapacity == 0) {
//            this.elem = new int[DEFAULT_SIZE]; // 使用默认大小
//        }
//
//        this.usedSize = 0; // 初始化 usedSize
//    }
//
//    public void add(int x) {
//        if(isFull()) {
//            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
//        }
//
//        this.elem[this.usedSize] = x;
//        this.usedSize++;
//    }
//
//    public int size() {
//        return this.usedSize;
//    }
//
//    public boolean isFull() {
//        return size() >= this.elem.length;
//    }
//
//    public void add(int pos,int x) {
//        if(isFull()) {
//            System.out.println("满了");
//            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
//        }
//
//        if(pos < 0 || pos > this.elem.length) {
//            System.out.println("位置选择不合法");
//            return;
//        }
//
//        for(int i = this.usedSize - 1; i >= pos; i--) {
//            this.elem[i+1] = this.elem[i];
//        }
//
//        this.elem[pos] = x;
//        this.usedSize++;
//    }
//
//
//    public boolean contains(int x) {
//        for(int e : this.elem) {
//            if(x == e) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    public int indexOf(int x) {
//        for(int i =0; i<this.size(); i++) {
//            if(this.elem[i] == x) {
//                return i;
//            }
//        }
//        return -1;
//    }
//
//    public int get(int pos) {
//        if(isEmpty()) {
//            System.out.println("当前顺序表为空");
//            return -1;
//        }
//        if(pos < 0 || pos > this.usedSize) {
//            System.out.println("get获取元素的时候，pos不合法异常！");
//        }
//
//        return this.elem[pos];
//    }
//
//    public boolean isEmpty() {
//        return size() == 0;
//    }
//
//    public void set(int pos,int val) {
//        if(isEmpty()) {
//            System.out.println("当前顺序表为空");
//            return;
//        }
//
//        if(pos < 0 || pos > this.usedSize) {
//            System.out.println("set获取元素的时候，pos不合法异常！");
//        }
//
//        this.elem[pos] = val;
//    }
//
//    public void remove(int key) {
//        if(isEmpty()) {
//            System.out.println("当前顺序表为空");
//            return;
//        }
//
//        int index = this.indexOf(key);
//        if(index == -1) {
//            System.out.println("没有这个元素");
//            return;
//        }
//
//        for(int i = index; i < size() - 1; i++) {
//            this.elem[i] = this.elem[i+1];
//        }
//        this.usedSize--;
//    }
//
//    public void clear() {
//        for(int i =0; i<size(); i++) {
//            this.elem[i] = 0;
//        }
//        this.usedSize = 0;
//    }
//
//    public void display() {
//        for (int i = 0; i < this.usedSize; i++) {
//        System.out.print(this.elem[i] + " ");
//        }
//                System.out.println();
//    }
//}
//
//


public class MyArrayList<T> {
    private Object[] elem;
    private int usedSize; // 记录有效元素的个数
    private static final int DEFAULT_SIZE = 10;

    public MyArrayList() {
        this.elem = new Object[DEFAULT_SIZE];
        this.usedSize = 0;
    }

    // 带初始容量的构造函数
    public MyArrayList(int initCapacity) {
        if (initCapacity > 0) {
            this.elem = new Object[initCapacity];
        } else if (initCapacity == 0) {
            this.elem = new Object[DEFAULT_SIZE];
        }
        this.usedSize = 0;
    }

    public void add(T x) {
        if (isFull()) {
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }
        this.elem[this.usedSize] = x;
        this.usedSize++;
    }

    public int size() {
        return this.usedSize;
    }

    public boolean isFull() {
        return size() >= this.elem.length;
    }

    public void add(int pos, T x) {
        if (isFull()) {
            System.out.println("满了");
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }

        if (pos < 0 || pos > this.elem.length) {
            System.out.println("位置选择不合法");
            return;
        }

        for (int i = this.usedSize - 1; i >= pos; i--) {
            this.elem[i + 1] = this.elem[i];
        }

        this.elem[pos] = x;
        this.usedSize++;
    }

    public boolean contains(T x) {
        for (Object e : this.elem) {
            if (x.equals(e)) {
                return true;
            }
        }
        return false;
    }

    public int indexOf(T x) {
        for (int i = 0; i < this.size(); i++) {
            if (x.equals(this.elem[i])) {
                return i;
            }
        }
        return -1;
    }

    @SuppressWarnings("unchecked")
    public T get(int pos) {
        if (isEmpty()) {
            System.out.println("当前顺序表为空");
            return null;
        }
        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("get获取元素的时候，pos不合法异常！");
            return null;
        }
        return (T) this.elem[pos]; // 类型转换
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    public void set(int pos, T val) {
        if (isEmpty()) {
            System.out.println("当前顺序表为空");
            return;
        }

        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("set获取元素的时候，pos不合法异常！");
            return;
        }

        this.elem[pos] = val;
    }

    public void remove(T key) {
        if (isEmpty()) {
            System.out.println("当前顺序表为空");
            return;
        }

        int index = this.indexOf(key);
        if (index == -1) {
            System.out.println("没有这个元素");
            return;
        }

        for (int i = index; i < size() - 1; i++) {
            this.elem[i] = this.elem[i + 1];
        }
        this.usedSize--;
    }

    public void clear() {
        for (int i = 0; i < size(); i++) {
            this.elem[i] = null; // 清空元素
        }
        this.usedSize = 0;
    }

    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
}
